#pragma once

#include<iostream>
#include<pthread.h>
#include<string>
#include<cstdlib>
#include<functional>





class Thread
{
public:
    typedef enum{NEW=0,RUNNING,EXITED}ThreadStatus;
    typedef void(*func_t)(void*);
public:
    Thread(int num,func_t func,void* args):_tid(0),_status(NEW),_func(func),_args(args)
    {
        char name[128];
        snprintf(name,sizeof(name),"thread-%d",num);
        _name=name;
    }
    //线程状态
    int status() {return _status;}
    //线程名
    std::string threadname(){return _name;}
    //线程id
    pthread_t threadid()
    {
        if(_status==RUNNING) return _tid;
        else return 0;
    }
    //如果类内 类成员函数具有默认参数this指针 要定义成static
    //static成员函数无法直接访问类的属性和其他成员方法（没有this指针）
    //创建线程参数传this
    static void* runHelper(void* args)
    {
        Thread* ts=(Thread*)args;
        //_func(_args);
        (*ts)();//通过仿函数调用
        return nullptr;
    }
    void operator()()
    {
        if(_func!=nullptr)
        _func(_args);
    }
    void run()
    {
        int n=pthread_create(&_tid,nullptr,runHelper,this);
        if(n!=0) exit(1);
        _status=RUNNING;
    }
    void join()
    {
        int n=pthread_join(_tid,nullptr);
        if(n!=0) 
        {
            std::cerr<<"main thread join thread "<<_name<<"error"<<std::endl;
            return ;
        }
        _status=EXITED;
    }


    ~Thread()
    {}
private:
    pthread_t _tid;
    std::string _name;
    func_t _func;//线程执行的回调
    void* _args;//回调函数参数
    ThreadStatus _status;
};